﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

namespace Canroc.Net.RemoteHttp.WeChatPay.Dto;

/// <summary>
///     退款请求输入项
/// </summary>
public class WeChatPayApiRefundInput
{
    /// <summary>
    ///     微信支付订单号
    /// </summary>
    [MaxLength(32)]
    [JsonPropertyName("transaction_id")]
    public string TransactionId { get; set; } = string.Empty;

    /// <summary>
    ///     商户订单号
    /// </summary>
    [Required]
    [MaxLength(32)]
    [JsonPropertyName("out_trade_no")]
    public string OutTradeNo { get; set; } = string.Empty;

    /// <summary>
    ///     商户退款单号
    /// </summary>
    [Required]
    [MaxLength(64)]
    [JsonPropertyName("out_refund_no")]
    public string OutRefundNo { get; set; } = string.Empty;

    /// <summary>
    ///     退款原因
    /// </summary>
    [MaxLength(80)]
    [JsonPropertyName("reason")]
    public string? Reason { get; set; }

    /// <summary>
    ///     退款结果回调url
    /// </summary>
    [MaxLength(256)]
    [JsonPropertyName("notify_url")]
    public string? NotifyUrl { get; set; }

    /// <summary>
    ///     退款资金来源
    /// </summary>
    /// <remarks>
    ///     AVAILABLE: 仅对老资金流商户适用，指定从可用余额账户出资
    /// </remarks>
    [JsonPropertyName("funds_account")]
    public string? FundsAccount { get; set; }

    /// <summary>
    ///     金额信息
    /// </summary>
    [Required]
    [JsonPropertyName("amount")]
    public RefundAmountInfo Amount { get; set; } = new();

    /// <summary>
    ///     退款商品详情
    /// </summary>
    [JsonPropertyName("goods_detail")]
    public List<RefundGoodsDetail>? GoodsDetail { get; set; }
}

/// <summary>
///     微信支付-退款-金额信息
/// </summary>
public class RefundAmountInfo
{
    /// <summary>
    ///     原订单金额
    /// </summary>
    /// <remarks>
    ///     单位为分
    /// </remarks>
    [Required]
    [JsonPropertyName("total")]
    public int Total { get; set; }

    /// <summary>
    ///     退款金额
    /// </summary>
    /// <remarks>
    ///     单位为分
    /// </remarks>
    [Required]
    [JsonPropertyName("refund")]
    public int Refund { get; set; }

    /// <summary>
    ///     退款币种
    /// </summary>
    [Required]
    [JsonPropertyName("currency")]
    public string Currency { get; set; } = "CNY";

    /// <summary>
    ///     退款出资账户及金额
    /// </summary>
    [Required]
    [JsonPropertyName("from")]
    public List<RefundAmountFromInfo>? From { get; set; }
}

/// <summary>
///     退款出资账户及金额
/// </summary>
public class RefundAmountFromInfo
{
    /// <summary>
    ///     出资账户类型
    /// </summary>
    /// <remarks>
    ///     AVAILABLE: 可用余额
    ///     UNAVAILABLE: 不可用余额
    /// </remarks>
    [Required]
    [JsonPropertyName("account")]
    public string Account { get; set; } = string.Empty;

    /// <summary>
    ///     出资金额
    /// </summary>
    /// <remarks>
    ///     单位为分
    /// </remarks>
    [Required]
    [JsonPropertyName("amount")]
    public int Amount { get; set; }
}

/// <summary>
///     退款商品详情
/// </summary>
public class RefundGoodsDetail
{
    /// <summary>
    ///     商户侧商品编码
    /// </summary>
    [Required]
    [JsonPropertyName("merchant_goods_id")]
    public string MerchantGoodsId { get; set; } = string.Empty;

    /// <summary>
    ///     微信侧商品编码
    /// </summary>
    [Required]
    [JsonPropertyName("wechatpay_goods_id")]
    public string WechatpayGoodsId { get; set; } = string.Empty;

    /// <summary>
    ///     商品名称
    /// </summary>
    [Required]
    [JsonPropertyName("goods_name")]
    public string GoodsName { get; set; } = string.Empty;

    /// <summary>
    ///     商品单价
    /// </summary>
    [Required]
    [JsonPropertyName("unit_price")]
    public int UnitPrice { get; set; }

    /// <summary>
    ///     商品退款金额
    /// </summary>
    /// <remarks>
    ///     单位为分
    /// </remarks>
    [JsonPropertyName("refund_amount")]
    public int RefundAmount { get; set; }

    /// <summary>
    ///     商品退货数量
    /// </summary>
    [JsonPropertyName("refund_quantity")]
    public int RefundQuantity { get; set; }
}